package ch7Array;

import javax.sound.midi.Soundbank;
import java.util.Arrays;
import java.util.Scanner;

public class HWExer {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
       /* 1:定义一个长度为10的数组，依次放入5的倍数，第一个放5,第二个放10,第三个放入15。。。*/
        int[] arr = new int[10];
        int n =0;
        for(int i = 0;i < arr.length;i++){
            n++;
            arr[i]=(n*5);
            System.out.println("数组的第"+(i+1)+"个数为："+arr[i]);
        }

        /*2：定义一个长度为31的整数数组，依次放入的2的若干次方，第一个放1，第二个放2，第三个放4，第四个放8。。。。并输出*/
        int [] arr1 = new int [31];
        int n1 = 1;
        for(int i=1;i<arr1.length;i++ ){
            n1 *=2;
            arr1[0]=1;
            arr1[i] = n1;
        }
        for(int j=0;j<arr1.length;j++){
            System.out.print(arr1[j] + " ");
        }

       /* 3：定义一个长度为10的数组，依次放入从1开始的各个数的平方，第一个放1的平方，第二个放2的平方，第三个放3的平方,然后倒序输出*/
        System.out.println();
        int[] arr2 =  new int[10];
        arr2[0]=1;
        for(int i =1;i<arr2.length;i++){
            arr2[i]=(i+1)*(i+1);
        }
        for(int i = 0;i<arr2.length;i++){
            System.out.print(arr2[i] +" ");
        }

        /*4：定义一个长度为100的整数数组，依次放入从200开始的各个数的平方，
        并依次减一，第一个放200的平方，第二个放199的平方，第三个放198的平方。。。,然后输出*/
        System.out.println();
        int[] arr3 = new int[100];
        int n3 =200;
        for(int i=0;i<arr3.length;i++){
            arr3[i] =n3*n3;
            n3--;
            System.out.print(arr3[i] + " ");
        }

        /*5:定义一个double类型的数组，长度是8，求数组中所有数的积*/
        System.out.println();
        double[] arr4 = new double[8];
        double mutiply = 1.0;
        System.out.print("请输入8个double类型的整数：");
        for(int j=0;j<arr4.length;j++){
            double dNum = scan.nextDouble();
            arr4[j]= dNum;
            mutiply *= arr4[j];
        }
        System.out.println(mutiply);

        /*6:在给定的一个整数数组中（ 长度是15），要求查找输入的数字出现的次数。*/
        int[] arr5 = new  int[15];
        System.out.println("请输入目标数字：");
        int dest =scan.nextInt();
        int account =0;
        boolean isExit = true;
        for(int i =0;i<arr5.length;i++){
            System.out.println("请输入第"+(i+1)+"个数字（需要包含你要找的目标数字）:");
            arr5[i]=scan.nextInt();
        }
        for(int j =0;j<arr5.length;j++){
            if(arr5[j]==dest){
                account++;
                isExit = false;
                continue;
            }else if(j==arr5.length-1){
                System.out.println("数组遍历完毕！");
                break;
            }
        }
        if(isExit){
            System.out.println("数组遍历完毕，没有找到你的目标数字!");
        }else {
            System.out.println("你的目标数字为："+dest+"，在该数组中出现了"+account+"次");
        }


        /*7:在给定的一个整数数组中（ 长度是10），要求查找最小的数字和他的位置
        比如 {1，20,4,21,-45}这个数组，
        结果是 -45,位置是4*/
        int[] arr6 = new int[10];
        System.out.println("请输入10个整数:");
        int min =arr6[0];
        int index =0;
        for(int i =0;i<arr6.length;i++){
            int fNum = scan.nextInt();
            arr6[i]= fNum;
            if(min>arr6[i]){
                min =arr6[i];
                index=i;
            }
        }
        for(int j =0;j<arr6.length;j++ ){
            System.out.print(arr6[j]+ " ");
        }
        System.out.println();
        System.out.println("这个数组中最小的为："+min+"其位置为：" + index);


        /*8:在给定的一个整数数组中（ 长度是20），要求查找第二大的数字是多少*/
        int[] arr7 = new int[20];
        System.out.println("请输入20个整数：");
        int max=arr7[0];
        boolean isExit1 =true;
        int index2= 0 ;
        int max2 =arr7[0];
        for(int i =0;i<arr7.length;i++){
            int  sNum= scan.nextInt();
            arr7[i]=sNum;
            System.out.print(arr7[i]+" ");
        }
        for(int i=0;i<arr7.length;i++){
            if(max <arr7[i]){
                max = arr7[i];
                index2=i;
                continue;
            }
        }
        for(int j =0;j<arr7.length;j++){
            if(max2<arr7[j] && arr7[j]!=arr7[index2]){
                max2 = arr7[j];
                continue;
            }
        }
        System.out.println();
        System.out.println("第二大的数为:" + max2);

       /*9:baidu快速排序算法和插入排序算法的实现，并记住*/
        /*public class QuickSort {
            private static void swap(int[] data, int i,int j) {
                int temp = data[i];
                data[i] = data[j];
                data[j] = temp;
            }
            private static void subSort(int[] data,int start,int end) {
                if (start < end) {
                    int base = data[start];
                    int low = start;
                    int high = end + 1;
                    while(true) {
                        while(low < end && data[++low] - base <= 0)
                            ;
                        while(high > start && data[--high] - base >= 0)
                            ;
                        if(low < high) {
                            swap(data,low,high);
                        }else {
                            break;
                        }
                    }
                    swap(data,start,high);

                    subSort(data,start,high - 1);//递归调用
                    subSort(data,high + 1,end);
                }
            }
            public static void quickSort(int[] data) {
                subSort(data,0,data.length - 1);
            }

            public static void main(String [] args) {

                int[] data = {9,-16,30,23,-30,-49,25,21,30};
                System.out.println("排序之前：\n" + java.util.Arrays.toString(data));
                quickSort(data);
                System.out.println("排序之后：\n" + java.util.Arrays.toString(data));
            }*/


        /*import java.util.Arrays;

        public class InsertSort {
            public static void insertSort(int[] arr){
                int j = 0;
                int temp =0;
                for(int i =1;i<arr.length;i++){
                    temp = arr[i];
                    for(j=i-1;j>=0;j--){
                        if(arr[j]>temp){
                            arr[j+1]=arr[j];
                        }else{
                            break;
                        }
                    }
                    arr[j+1]=temp;
                }
                System.out.println(Arrays.toString(arr));
            }
            public static void main (String[] args){
                int []arr={1,32,2,12,33};
                insertSort(arr);
            }
*/
            /*10：定义两个整数数组，判断他们是否相同（数组长度一样，并且每个位置上的值都是相同，则认为数组相同）*/
        System.out.println("输入数组arr9的长度：");
        int length9 = scan.nextInt();
        System.out.println("输入数组arr10的长度：");
        int length10 = scan.nextInt();
        int[] arr9 = new int[length9];
        int[] arr10 = new int[length10];
        System.out.println("请输入数组arr9中的"+length9+"个元素：");
        for(int i= 0;i<arr9.length;i++){
            arr9[i]=scan.nextInt();
        }
        System.out.println("请输入数组arr10中的"+length10+"个元素");
        for(int j= 0;j<arr10.length;j++){
            arr10[j]=scan.nextInt();
        }
        if(arr9.length==arr10.length){
            for(int k =0;k<arr9.length;k++){
                if(arr9[k]==arr10[k]){
                    break;
                }else{
                    System.out.println("不同！");
                }
            }
            System.out.println("两个数组相同！");
        }else {
            System.out.println("数组arr9与数组arr10不一样！");
        }

        /*11：定义一个整数数组，判断其中是否有重复的数据*/
        System.out.println("请输入数组长度;");
        int length11 = scan.nextInt();
        int[] arr11 = new int[length11];
        boolean isSame = true;
        System.out.println("请输入"+length11 +"个数组元素：");
        for(int i=0;i< arr11.length;i++){
            arr11[i]=scan.nextInt();
            System.out.print(arr11[i]+ " ");
        }
        for(int j=0;j<arr11.length;j++){
            for(int k =0;k<arr11.length;k++){
                if(arr11[j]==arr11[k]&& k!=j ){
                    isSame = true;//这个地方一定要加，这里是重置！！！！！
                    break;
                }else {
                    isSame =false;
                    //continue;//这个可以不要完全
                }
            }if(isSame==true){
                System.out.println("该数组中存在重复的数据");
                break;
            }
        }
        if(isSame ==false){
            System.out.println("没有重复的数据！");
        }
        /*12：定义一个整数数组，输出比平均值大的数*/
        System.out.println("请输入数组的长度：");
        int length12 = scan.nextInt();
        int sum=0;
        int average =0;
        int[] arr12 = new int[length12];
        System.out.println("请输入"+length12+"个数:");
        for(int i= 0;i<arr12.length;i++){
            arr12[i] =scan.nextInt();
            sum += arr12[i];
        }
        average =sum/arr12.length;
        System.out.println("平均数为:" + average);
        for(int j =0;j<arr12.length;j++){
            if(arr12[j]>average){
                System.out.print(arr12[j] + " ");
            }
        }

        /*13:福彩双色球的玩法分为红球和篮球（具体玩法百度），
        红球范围是1-33，蓝球是1-16。
        每注是6个红球不重复并按照升序顺序排列，加上一个蓝球。
        生成一注号码放入数组中，随机数的方法是Math.random()*/
        int[] arr13 = new int[7];
        int account13=0;
        for(int i=0;i<arr13.length-1;i++){
            arr13[i]= (int)(Math.random()*33 +1);
        }
        arr13[6]=(int)(Math.random()*16+1);
        for(int i =0;i<arr13.length-1-1;i++){
            for(int j=0;j<arr13.length-1-1-i;j++){
                if(arr13[j]>arr13[j+1]){
                    int temp =arr13[j];
                    arr13[j]= arr13[j+1];
                    arr13[j+1]=temp;
                }
            }
        }
        //查看中将号码
        for(int i=0;i<arr13.length;i++){
            System.out.print(arr13[i]+" ");
        }
        System.out.println();

        int[] arr131 =new int[7];
        System.out.println("请输入你的7位福彩双色球号码(前六位从小到大数字且[1,33])，最后一位数字[1,16]：");
        //键盘输入自己的双色球号码
        for(int i =0;i<arr131.length;i++){
            arr131[i]=scan.nextInt();
        }

        //查看红球能中的个数
        for(int k=0;k<arr13.length-1;k++){
            if(arr131[k]==arr13[k]){
                account13++;
                continue;
            }
        }
        //判断当蓝色的球中时
        if(arr131[6]==arr13[6]){
            if(account13 == 6){
                System.out.println("中了一等奖");
            }else if(account13==5){
                System.out.println("中了三等奖");
            }else if(account13==4){
                System.out.println("中了四等奖");
            }else if(account13==3){
                System.out.println("中了五等奖");
            }else{
                System.out.println("中了六等奖");
            }
        }else {
            if (account13==6){
                System.out.println("中了二等奖");
            }else if(account13==5){
                System.out.println("中了四等奖");
            }else if(account13==4){
                System.out.println("中了五等奖");
            }else{
                System.out.println("没有中奖！");
            }
        }

        /*14:定义一个数组，将其颠倒（第一个放到最后一个，第二个放到倒数第二个。。。）
        然后输出这个数组。*/
        System.out.println("请输入数组的长度：");
        int length14 = scan.nextInt();
        int[] arr14 = new int[length14];
        System.out.println("请输入"+length14+"个数组元素（整数）：");
        for(int i = 0;i<arr14.length;i++){
            arr14[i] = scan.nextInt();
            System.out.print(arr14[i]+" ");
        }
        System.out.println();//单纯和换行便于观看
        for(int j =0;j<arr14.length/2;j++){
            int temp = arr14[j];
            arr14[j] = arr14[length14-1-j];
            arr14[length14-1-j] = temp;
        }
        for(int k =0;k<arr14.length;k++){
            System.out.print(arr14[k]+" ");
        }


       /* *15：把分解质因数的结果放入数组*/ //90=2*3*3*5
        System.out.println("请输入一个整数：");
        int num15 = scan.nextInt();
        System.out.println("请输入数组的长度（尽可能大！！）：");
        int length15 = scan.nextInt();
        int[] arr15 = new int[length15];
        int n15=0;
        for(int i =2;i<=num15;i++){//90=2 3 3 5
            while(num15!=i) {
                if (num15 % i == 0) {
                    arr15[n15] = i;
                    n15++;
                    //System.out.print(i +" ");
                    num15 /= i;
                    //System.out.println(arr15[j] +" ");
                }
                else {
                    break;
                }
            }
        }
        if(num15 >2){
            arr15[n15]=num15;//此处要填n15。而不是（n15+1）因为（前面的n15++,最后加1了）
        }else{
            arr15[0]=num15;
        }
        for(int k=0;k<arr15.length;k++){
            System.out.print(arr15[k] + " ");
        }

        /*16：定义整数的 二维数组。
        求二维数组中的最大值*/
        int[] arr16[] = new int[][]{{1,2,3},{4,5,6},{7,8,9}};
        int max16 = arr16[0][0];
        for(int i =0;i<arr16.length;i++){
            for(int j =0;j<arr16[i].length;j++){
                if(max16<= arr16[i][j]){
                    max16 =arr16[i][j];
                    continue;
                }

            }
        }
        System.out.println("二维数组中最大的数为:" + max);
    }
}
